package mac5789.projeto4;

import java.io.File;
import java.io.FileInputStream;

import mac5789.projeto4.algorithm.MarkovDecisionProcess;
import mac5789.projeto4.algorithm.RTDPMDP;
import mac5789.projeto4.algorithm.ValueIterationMDP;
import mac5789.projeto4.model.Action;
import mac5789.projeto4.model.Policy;
import mac5789.projeto4.model.State;
import mac5789.projeto4.model.WorldModel;
import mac5789.projeto4.parser.WorldModelParser;

/**
 * Aplicação que permite o uso dos algoritmos por linha de comando.
 * 
 * @author lundberg
 * 
 */
public class Main {

	private static double acceptableError = 0.01;

	public static void main(String... args) throws Exception {
		if (args.length != 2) {
			System.out.println("Modo de usar: java -jar projeto4.jar <algoritmo (VI ou RTDP)> <arquivo de entrada>");
			return;
		}
		MarkovDecisionProcess algorithm;
		if ("VI".equals(args[0])) {
			algorithm = new ValueIterationMDP(acceptableError);
		} else if ("RTDP".equals(args[0])) {
			algorithm = new RTDPMDP(acceptableError);
		} else {
			System.out.println(String.format("Algoritmo desconhecido: %s. Escolha VI ou RTDP.", args[0]));
			return;
		}
		File file = new File(args[1]);
		if (!file.exists()) {
			System.out.println("Arquivo não encontrado: " + args[1]);
		}
		if (file.isDirectory()) {
			System.out.println("Arquivo de entrada é um diretório.");
		}

		WorldModel world = new WorldModelParser(new FileInputStream(file)).parse();
		Policy policy = algorithm.createPolicy(world);
		for (State state : world.states()) {
			Action action = policy.whatToDoGiven(state);
			System.out.println(state.getToken() + " " + String.valueOf(action == null ? null : action.getToken()));
		}
	}
}
